#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int g_argc = 0;

char *g_argv[64];
const int commamsize = 64;
char common[commamsize];

char *getPWd()
{
    char *pwd = getenv("PWD");
    return pwd;
}
char *getuser()
{
    char *user = getenv("USER");
    return user;
}
void changeuser()
{
    setenv("USER","pq",1);
}
char *gethostname()
{
    putenv((char *)"hostname=hcss-ecs-d89c");
    return getenv("hostname");
}
void PrintConsole() // 获取控制台
{
    char *pwd = getPWd();
    char *user = getuser();
    char *hostname = gethostname();
    printf("%s@%s%s:", user, hostname, pwd);
    fflush(stdout);
}
bool getcommanline(char *out, int size) // 获取命令行参数
{
    char *c = fgets(out, size, stdin);
    if (c == out)
    {
        out[strlen(out) - 1] = '\0';
        return 1;
    }
    else
        return 0;
}
// ls -a -l;
bool CommandParse(char *comman)
{

    const char *sep = " ";
    g_argc = 0;
    g_argv[g_argc++] = strtok(comman, sep);
    while ((bool)(g_argv[g_argc++] = strtok(nullptr, sep)))
        ;
    g_argc--;
    return true;
}


// }
// bool CommandParse(char *commandline)
// {
// #define SEP " "
//     g_argc = 0;
//     // 命令行分析 "ls -a -l" -> "ls" "-a" "-l"
//     g_argv[g_argc++] = strtok(commandline, SEP);
//     while((bool)(g_argv[g_argc++] = strtok(nullptr, SEP)));
//  //   g_argc--;
//     return true;
// }
// bool CommandParse(char *comman) {
//     const char *sep = " ";
//     g_argc = 0;
//     char *token = strtok(comman, sep);  // 首次调用 strtok
//     while (token !=nullptr&& g_argc< 64) {  // 检查 token 是否为
//         g_argv[g_argc++] = token;
//         token = strtok(nullptr, sep);  // 后续调用 strtok(, sep)
//     }
//     return true;
//}

int execure()
{
    pid_t id = fork();
    if (id < 0)
    {
        perror("fork fail");
        exit(1);
    }
    if (id == 0)
    {
        execvp(g_argv[0], g_argv);
        exit(0);
    }
    pid_t rid = waitpid(id, nullptr, 0);
    (void)rid; // rid使用一下
    return 0;
}
// void Cd()//走到这里肯定是cd命令了
// {//的重新修改g_argv;(不需要)


// chdir(g_argv[1]);

//}

// void Cd() {
//     if (g_argc < 2) {
//         fprintf(stderr, "cd: missing argument\n");
//         return;
//     }
//     if (chdir(g_argv[1]) != 0) {
//         perror("cd failed");
//     }
// }
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void Cd() {
    if (g_argc < 2) {
        fprintf(stderr, "cd: missing argument\n");
        return;
    }

    // 尝试切换目录
    if (chdir(g_argv[1]) != 0) {
        perror("cd failed");
        return;
    }

    // 更新 PWD 环境变量
    char cwd[1024];
    if (getcwd(cwd, sizeof(cwd)) !=0) {
        setenv("PWD", cwd, 1); // 更新 PWD 环境变量
    } else {
        perror("getcwd failed");
    }
}
void printenv(char*envp[])
{
    for(int i=0;envp[i];i++)
    {
        printf("envp[%d]=%s\n",i,envp[i]);
    }
}
bool CheckAndExecBuiltin(char**envp)
{
    std::string cmd = g_argv[0];
    if(cmd == "cd")
    {
        Cd();
        return true;
    }
    else if(cmd == "echo")
    {
        //Echo();
        return true;
    }
    else if(cmd=="env")
    {
   printenv(envp);
    }
  
    
    else
    {
        execure();
        return true;
    }
   

    return false;
}
//打印环境变量表

int main(int argc, char *argv[],char*envp[])
{
   while(1)
   {
    //printf("%s",getenv("USER"));
     char comman[64];
    PrintConsole();
    getcommanline(comman, sizeof(comman));
//common=comman;
    CommandParse(comman);
  CheckAndExecBuiltin(envp);
//    execure();
//     for (int i = 0; i < g_argc; i++)
//      {

//          printf("%s\n", g_argv[i]);
//      }
    }
    return 0;
}